[Amazon SageMaker] 組み込みアルゴリズム(物体検出)モデルをMXNetで利用できるようにする環境をSageMaker Studio Notebooksで作ってみました
1 はじめに
CX事業本部の平内(SIN)です。
Amazon SageMaker(以下、SageMaker)の組み込みアルゴリズム(物体検出)で作成されたモデルは、MXNetの環境で利用するために変換(損失層の削除とNMS層を追加)が必要です。
また、同モデルをSageMaker Neo(以下、Neo)でコンパイルする際も、この変換が必要です。
この変換作業は、https://github.com/zhreshold/mxnet-ssdのdeploy.pyで可能なことを以前紹介しましたが、この時点では、Python2.xの環境が必要でした。
[Amazon SageMaker] 組み込みアルゴリズムのオブジェクト検出(ResNet-50)をMac上のMXNetで利用してみました
今回、同じ作業を確認すると、Python3でも可能になっていたので、改めて、纏めておくことにしました。 Amazon SageMaker Studio(以下、SageMaker Studio)では、Python3による各種環境が用意されているので、こちらで作業を進めています。
2 環境
DemoNotebooksの下に、作業環境としてConvertMXNetを作成し、convert_mxnet.ipynbというノートブックを配置しました。
Kernelは、Python 3 (MXNet 1.8 Python 3.7 CPU Optimized、インスタンスは、ml.t3.mediumを利用しています。
3 Notebook
ノートブックで作業している内容は、以下のとおりです。
(1) mxnetのインストール
最初に、mxnetをインストールしています。pipでインストールすると、バージョンは、1.7となっていました。
!pip3 install mxnet import mxnet print("MXNet Version {}".format(mxnet.__version__))
(2) ライブラリ・パス
必要なライブラリのimportと、パスの指定です。
import os import shutil import boto3 import glob # 作業フォルダ TMP_FOLDER='./tmp' # モデル名 MODEL_NAME='model.tar.gz'
(3) 作業フォルダ
フォルダの初期化では、存在する場合は、一旦削除して再作成しています。
if os.path.exists(TMP_FOLDER): shutil.rmtree(TMP_FOLDER) os.mkdir(TMP_FOLDER)
(4) 変換元モデル
変換元となる物体検出モデルをS3バケットからダウンロードします。手元にmodel.tar.gzがある場合は直接作業フォルダにアップロードしても構いません。
InputBucket = 'sagemaker-working-bucket-xxx' InputKey = 'smart-cooler-500/output/' + MODEL_NAME s3 = boto3.resource('s3') bucket = s3.Bucket(InputBucket) bucket.download_file(InputKey, TMP_FOLDER + '/' + MODEL_NAME)
また、作業フォルダ内で展開しています。
!tar xvfz $TMP_FOLDER/$MODEL_NAME -C $TMP_FOLDER
(5) ツールのダウンロード
Githubからツールをダウンロードして、ヘルプ表示で動作確認しています。
os.environ['PYTHONPATH'] = os.getcwd() + '/mxnet-ssd/symbol/' print("export PYTHONPATH={}".format(os.environ.get('PYTHONPATH'))) !git clone https://github.com/zhreshold/mxnet-ssd.git !python mxnet-ssd/deploy.py -h
実は、そのまま実行すると、下記のようにエラーとなってしまいます。
ImportError: cannot import name 'multi_layer_feature' from 'common' (/home/sagemaker-user/.local/lib/python3.7/site-packages/common/__init__.py)
これは、 mxnet-ssd/symbol/commonが読み込めないのが原因なので、最初にPYTHONPATHにパスを追加しています。
参考:https://github.com/zhreshold/mxnet-ssd/issues/229
実行環境に問題がなければ、下記のようにヘルプが表示されます。
(6) ハイパーパラメータ確認
元モデルのhyperparams.jsonから、ハイパーパラメータを確認しています。これは、変換時に指定する必要があるパラメーター(クラス数など)を確認するためです。
!cat $TMP_FOLDER/hyperparams.json
(7) 変換
ツール(deploy.py)による変換の前に、一部コードを修正しています。
mxnet-ssd/symbol/symbol_factory.pyには、Python3で廃止となった、xrangeが使用されているため、このままでは実行できないので、rangeに置き換えています。
# mxnet-ssd/symbol/symbol_factory.pyの「xrange」を「range」に修正 file_name = os.getcwd() + '/mxnet-ssd/symbol/symbol_factory.py' with open(file_name) as f: data_lines = f.read() data_lines = data_lines.replace("xrange", "range") with open(file_name, mode="w") as f: f.write(data_lines)
以下が、変換です。ベースネットワークやクラス数などのパラメータ指定が必要です。
!python mxnet-ssd/deploy.py --network resnet50 --num-class 6 --nms .45 --data-shape 512 --prefix $TMP_FOLDER/model_algo_1
(8) 出力
出力されたファイルです。
!ls -la $TMP_FOLDER/deploy*
Neoでのコンパイルする際の元となるモデルとしては、この2つのファイルをtar.gzに圧縮して、S3に配置することで利用可能です。
4 最後に
今回は、SageMakerの組み込みアルゴリズム(物体検出)で作成されたモデルをMXNetで利用可能なように変換するNotebookをSageMaker Studioで作成してました。
1つこの環境を用意しておけば、軽易に変換の作業ができそうです。